package com.zomiot.portal.user.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zomiot.portal.user.entity.UserPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

/**
 * 用户数据访问层
 *
 * 继承BaseMapper后，自动拥有以下方法：
 * - insert(entity)：插入
 * - updateById(entity)：根据ID更新
 * - selectById(id)：根据ID查询
 * - selectList(queryWrapper)：条件查询
 * - deleteById(id)：根据ID删除
 * - selectCount(queryWrapper)：统计数量
 * - ...等
 *
 * @author Joash_YI
 */
@Mapper
public interface UserMapper extends BaseMapper<UserPO> {

    /**
     * 根据用户名查询用户
     *
     * MyBatis Plus会自动实现简单的SQL查询
     * 也可以使用@Select注解自定义SQL
     *
     * @param username 用户名
     * @return 用户对象（可能为null）
     */
    @Select("SELECT * FROM portal_user WHERE username = #{username}")
    UserPO selectByUsername(@Param("username") String username);

    /**
     * 根据手机号查询用户
     *
     * @param telephone 手机号
     * @return 用户对象（可能为null）
     */
    @Select("SELECT * FROM portal_user WHERE telephone = #{telephone}")
    UserPO selectByTelephone(@Param("telephone") String telephone);

    /**
     * 根据邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户对象（可能为null）
     */
    @Select("SELECT * FROM portal_user WHERE email = #{email}")
    UserPO selectByEmail(@Param("email") String email);

    /**
     * 检查用户名是否已存在
     *
     * @param username 用户名
     * @return 存在的数量（0=不存在，>0=存在）
     */
    @Select("SELECT COUNT(*) FROM portal_user WHERE username = #{username}")
    int countByUsername(@Param("username") String username);

    /**
     * 检查手机号是否已存在
     *
     * @param telephone 手机号
     * @return 存在的数量（0=不存在，>0=存在）
     */
    @Select("SELECT COUNT(*) FROM portal_user WHERE telephone = #{telephone}")
    int countByTelephone(@Param("telephone") String telephone);

    /**
     * 检查邮箱是否已存在
     *
     * @param email 邮箱
     * @return 存在的数量（0=不存在，>0=存在）
     */
    @Select("SELECT COUNT(*) FROM portal_user WHERE email = #{email}")
    int countByEmail(@Param("email") String email);
}
